﻿<?xml version="1.0" encoding="UTF-8"?>

<!-- ******************* -->
<!-- Entity declarations -->
<!-- ******************* -->

<!ENTITY % attr.altrep "
   altrep ENTITY #IMPLIED
   ">

<!ENTITY % attr.cn "
   cn CDATA ''
   ">

<!ENTITY % attr.cutype "
   cutype NMTOKEN 'INDIVIDUAL'
   ">
<!-- Valid name tokens are "INDIVIDUAL", "GROUP", "RESOURCE" -->
<!-- "ROOM", "UNKNOWN", a non-standard "X-" name or another -->
<!-- IANA registered name. -->

<!ENTITY % attr.delegated-from "
   delegated-from CDATA #IMPLIED
   ">
<!-- delegated-from value is a calendar user address -->

<!ENTITY % attr.delegated-to "
   delegated-to CDATA #IMPLIED
   ">
<!-- delegated-to value is one or more calendar user addresses -->

<!ENTITY % attr.dir "
   dir ENTITY #IMPLIED
   ">
<!-- dir value is a URI to a directory entry -->

<!ENTITY % attr.fmttype "
   fmttype CDATA #REQUIRED
   ">
<!-- fmttype value is any IANA registered content type -->

<!ENTITY % attr.fbtype "
   fbtype NMTOKEN 'BUSY'
   ">


<!-- Valid token values are "FREE", "BUSY", "BUSY-UNAVAILABLE", -->
<!-- "BUSY-TENTATIVE", a non-standard "X-" name or another -->
<!-- IANA registered name. -->

<!ENTITY % attr.language "
   language CDATA #IMPLIED
   ">
<!-- language value is a valid RFC 1766 language string -->

<!ENTITY % attr.member "
   member CDATA #IMPLIED
   ">
<!-- member value is one or more calendar user addresses -->

<!ENTITY % attr.partstat "
   partstat NMTOKEN 'NEEDS-ACTION'
   ">
<!-- Valid token value for VEVENT: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", "TENTATIVE", "DELEGATED", a non-standard "X- -->
<!-- name or another IANA registered name. -->

<!-- Valid token value for VTODO: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", "TENTATIVE", "DELEGATED", "COMPLETED", -->
<!-- "IN-PROGRESS, a non-standard "X- name or another IANA -->
<!-- registered name. -->
<!-- Valid token value for VJOURNAL: "NEEDS-ACTION", "ACCEPTED", -->
<!-- "DECLINED", a non-standard "X- name or another IANA -->
<!-- registered name. -->

<!ENTITY % attr.range "
   range NMTOKEN 'THISONLY'
   ">
<!-- Valid token values are "THISONLY" or "THISANDPRIOR" or -->
<!-- "THISANDFUTURE" -->

<!ENTITY % attr.related "
   related NMTOKEN 'START'
   ">
<!-- Valid token values are "START" or "END" -->

<!ENTITY % attr.reltype "
   reltype NMTOKEN 'PARENT'
   ">
<!-- Valid token values are "PARENT", "CHILD", SIBLING", -->
<!-- a non-standard "X-" name or any IANA registered name. -->

<!ENTITY % attr.role "
   role NMTOKEN 'REQ-PARTICIPANT'
   ">


<!-- Valid token values are "CHAIR", "REQ-PARTICIPANT", -->
<!-- "OPT-PARTICIPANT", "NON-PARTICIPANT", a non-standard "X-" -->
<!-- name or any IANA registered name. -->

<!ENTITY % attr.rsvp "
   rsvp NMTOKEN 'FALSE'
   ">
<!-- Valid token values are "TRUE" or "FALSE", -->

<!ENTITY % attr.sent-by "
   sent-by CDATA #IMPLIED
   ">
<!-- sent-by value is a calendar user address -->

<!ENTITY % attr.tzid "
   tzid CDATA #IMPLIED
   ">
<!-- tzid value is a time zone identifier -->

<!ENTITY % cal.comp "
   vevent | vtodo | vjournal | vfreebusy | vtimezone
   ">

<!ENTITY % vevent.opt1 "
   class | created | description | dtstamp | dtstart | geo |
   last-modified | location | organizer | priority | recurrence-id |
   sequence | status | summary | transp | uid | url |
   (dtend | duration)
   ">
<!-- These properties may only appear once in a VEVENT -->
<!ENTITY % vevent.optm "
   attach | attendee | categories | comment | contact |
   exdate | exrule | rdate | related-to | resources | request-status |
   rrule
   ">
<!-- These properties may appear one or more times in a VEVENT -->

<!ENTITY % vtodo.opt1 "
   class | completed | created | description | dtstamp | dtstart |
   geo | last-modified | location | organizer | percent | priority |
   recurrence-id | sequence | status | summary | uid | url |
   (due | duration)
   ">
<!-- These properties may only appear once in a VTODO -->

<!ENTITY % vtodo.optm "
   attach | attendee | categories | comment | contact |
   exdate | exrule | request-status | related-to | resources |
   rdate | rrule


   ">
<!-- These properties may appear one or more times in a VTODO -->

<!ENTITY % vjournal.opt1 "
   class | created | description | dtstart | dtstamp | last-modified |
   organizer | recurrence-id | sequence | status | summary | uid | url
   ">
<!-- These properties may only appear once in a VJOURNAL -->

<!ENTITY % vjournal.optm "
   attach | attendee | categories | comment | contact |
   exdate | exrule | related-to | rdate | rrule | request-status
   ">
<!-- These properties may appear one or more times in a VJOURNAL -->

<!ENTITY % vfreebusy.opt1 "
   contact | dtstamp | dtstart | dtend | duration |
   organizer | uid | url
   ">
<!-- These properties may only appear once in a VFREEBUSY -->

<!ENTITY % vfreebusy.optm "
   attendee | comment | freebusy | request-status
   ">
<!-- These properties may appear one or more times in a -->
<!-- VFREEBUSY -->

<!ENTITY % vtimezone.man "
   tzid
   ">
<!-- These properties must appear in a VTIMEZONE -->

<!ENTITY % vtimezone.opt1 "
   last-modified | tzurl
   ">
<!-- These properties may only appear once in a VTIMEZONE -->

<!ENTITY % vtimezone.mann "
   (standard | daylight), (standard | daylight)*
   ">
<!-- These properties must appear in a VTIMEZONE and may -->
<!-- appear multiple times -->

<!ENTITY % standard.man "
   dtstart | tzoffsetto | tzoffsetfrom
   ">
<!-- These properties must appear in a STANDARD, but only once -->

<!ENTITY % standard.optm "


   comment | rdate | rrule | tzname
   ">
<!-- These properties may appear one or more times in a STANDARD -->

<!ENTITY % daylight.man "
   dtstart | tzoffsetto | tzoffsetfrom
   ">
<!-- These properties must appear in a DAYLIGHT, but only once -->

<!ENTITY % daylight.optm "
   comment | rdate | rrule | tzname
   ">
<!-- These properties may appear one or more times in a DAYLIGHT -->

<!ENTITY % audio.man "
   action, trigger
   ">
<!-- These properties must appear in an audio VALARM. -->

<!ENTITY % audio.optx "
   duration | repeat
   ">
<!-- These properties may appear once in an audio VALARM. If one -->
<!-- appears, then both must appear. -->

<!ENTITY % audio.opt1 "
   attach
   ">
<!-- These properties may appear once in an audio VALARM. -->

<!ENTITY % valarm.audio "
   (%audio.man;), (%audio.optx;)*, (%audio.opt1;)
   ">

<!ENTITY % display.man "
   action, description, trigger
   ">
<!-- These properties must appear in a display VALARM. -->
<!ENTITY % display.optx "
   duration | repeat
   ">
<!-- These properties may appear once in a display VALARM. If -->
<!-- one appears, then both must appear. -->

<!ENTITY % valarm.display "
   (%display.man;), (%display.optx;)*
   ">

<!ENTITY % email.man "
   action, description, summary, trigger
   ">
<!-- These properties must appear in an email VALARM. -->

<!ENTITY % email.optx "
   duration | repeat
   ">
<!-- These properties may appear once in an email VALARM. If one -->
<!-- appears, then both must appear. -->

<!ENTITY % email.optm "
   attach
   ">
<!-- These properties may appear one or more times in an email -->
<!-- VALARM. -->

<!ENTITY % email.mann "
   attendee
   ">
<!-- These properties must appear in an email VALARM. The may -->
<!-- appear more than once. -->

<!ENTITY % valarm.email "
   (%email.man;), (%email.optx;)*, (%email.optm;)*,
   (%email.mann;)*
   ">

<!ENTITY % procedure.man "
   action, attach, trigger
   ">
<!-- These properties must appear in an audio VALARM. -->

<!ENTITY % procedure.optx "
   duration | repeat
   ">
<!-- These properties may appear once in an procedure VALARM. -->
<!-- If one appears, then both must appear. -->

<!ENTITY % procedure.opt1 "
   description
   ">
<!-- These properties may appear once in a procedure VALARM -->
<!ENTITY % valarm.procedure "
   (%procedure.man;), (%procedure.optx;)*, (%procedure.opt1;)?
   ">

<!-- ******************************************** -->
<!-- iCalendar value type notation declarations   -->
<!-- ******************************************** -->


<!-- NOTE: The "XCAL" text in the following NOTATION values
   will be replaced with the text "RFC xxxx", where "xxxx" is the RFC
   number, when this memo is published as a RFC. -->

<!NOTATION BINARY PUBLIC "-//IETF//NOTATION XCAL/Value Type/Binary//EN">

<!NOTATION BOOLEAN PUBLIC "-//IETF//NOTATION XCAL/Value Type/Boolean//EN">

<!NOTATION CALADR PUBLIC "-//IETF//NOTATION XCAL/Value Type/Calendar
   User Address//EN">

<!NOTATION DATE PUBLIC "-//IETF//NOTATION XCAL/Value Type/Date//EN">

<!NOTATION DATE-TIME PUBLIC "-//IETF//NOTATION XCAL/Value
   Type/Date-Time//EN">

<!NOTATION DURATION PUBLIC "-//IETF//NOTATION XCAL/Value
   Type/Duration//EN">

<!NOTATION FLOAT PUBLIC "-//IETF//NOTATION XCAL/Value Type/Float//EN">

<!NOTATION INTEGER PUBLIC "-//IETF//NOTATION XCAL/Value Type/Integer//EN">

<!NOTATION PERIOD PUBLIC "-//IETF//NOTATION XCAL/Value
   Type/Period of Time//EN">

<!NOTATION RECUR PUBLIC "-//IETF//NOTATION XCAL/Value
   Type/Recurrence Rule//EN">

<!NOTATION TEXT PUBLIC "-//IETF//NOTATION XCAL/Value Type/Text//EN">

<!NOTATION TIME PUBLIC "-//IETF//NOTATION XCAL/Value Type/Time//EN">

<!NOTATION URI PUBLIC "-//IETF//NOTATION XCAL/Value Type/URI//EN">

<!NOTATION UTC-OFFSET PUBLIC "-//IETF//NOTATION XCAL/Value
   Type/UTC-Offset//EN">

<!NOTATION X-NAME PUBLIC "-//IETF//NOTATION XCAL/Value Type/X-Name//EN">

<!-- ************************************************* -->
<!-- iCalendar property element/attribute declarations -->
<!-- ************************************************* -->

<!ELEMENT br EMPTY>
<!-- Signifies a new line in the TEXT value content information -->

<!-- Description component properties element type declarations -->


<!ELEMENT attach (extref | b64bin)>
<!-- extref holds a reference to an external entity that -->
<!-- has the attachment. b64bin holds the inline BASE64 encoded -->
<!-- binary data for the attachment as defined in RFC 2045. -->

<!ELEMENT extref EMPTY>
<!ATTLIST extref
      uri ENTITY #REQUIRED>

<!ELEMENT b64bin (#PCDATA)>
<!ATTLIST b64bin
      %attr.fmttype;
      value NOTATION (BINARY) #IMPLIED>

<!ELEMENT categories (item)*>

<!ELEMENT item (#PCDATA)>
<!ATTLIST item
      %attr.language;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT class (#PCDATA)>
<!ATTLIST class
      %attr.language;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT comment (#PCDATA)*>
<!ATTLIST comment
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT description (#PCDATA)*>
<!ATTLIST description
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT geo (lat, lon)>

<!ELEMENT lat (#PCDATA)>
<!ATTLIST lat value NOTATION (FLOAT) #IMPLIED>
<!-- A decimal degree float number to 6 decimal places -->

<!ELEMENT lon (#PCDATA)>
<!ATTLIST lon value NOTATION (FLOAT) #IMPLIED>
<!-- A decimal degree float number to 6 decimal places -->

<!ELEMENT location (#PCDATA)>

<!ATTLIST location
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT percent (#PCDATA)>
<!ATTLIST percent
      value NOTATION (INTEGER) #IMPLIED>

<!ELEMENT priority (#PCDATA)>
<!ATTLIST priority
      value NOTATION (INTEGER) #IMPLIED>

<!ELEMENT resources (#PCDATA)>
<!ATTLIST resources
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT status (#PCDATA)>
<!ATTLIST status
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>
<!-- Text value must match the valid values for the particular -->
<!-- calendar component. -->

<!ELEMENT summary (#PCDATA)>
<!ATTLIST summary
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED >

<!-- Data and time component property element type declarations -->

<!ELEMENT dtstart (#PCDATA)>
<!ATTLIST dtstart
      %attr.tzid;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT dtend (#PCDATA)>
<!ATTLIST dtend
      %attr.tzid;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT due (#PCDATA)>
<!ATTLIST due
      %attr.tzid;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT completed (#PCDATA)>
<!ATTLIST completed
      value NOTATION (DATE-TIME) #IMPLIED>

<!ELEMENT duration (#PCDATA)>
<!ATTLIST duration
      value NOTATION (DURATION) #IMPLIED>

<!ELEMENT freebusy (#PCDATA)>
<!ATTLIST freebusy
      %attr.fbtype;
      value NOTATION (PERIOD) #IMPLIED>

<!ELEMENT transp (#PCDATA)>
<!ATTLIST transp
      value NOTATION (TEXT) #IMPLIED>
<!-- Text value must be one of the valid enumerations. -->

<!-- Time zone component property element type declarations -->

<!ELEMENT tzid (#PCDATA)>
<!ATTLIST tzid
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT tzname (#PCDATA)>
<!ATTLIST tzname
      %attr.language;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT tzoffsetfrom (#PCDATA)>
<!ATTLIST tzoffsetfrom
      value NOTATION (UTC-OFFSET) #IMPLIED>

<!ELEMENT tzoffsetto (#PCDATA)>
<!ATTLIST tzoffsetto
      value NOTATION (UTC-OFFSET) #IMPLIED>

<!ELEMENT tzurl EMPTY>
<!ATTLIST tzurl
      uri ENTITY #REQUIRED>

<!-- Relationship component property element type declarations -->

<!ELEMENT attendee (#PCDATA)>
<!ATTLIST attendee
      %attr.language;
      %attr.cn;
      %attr.role;
      %attr.partstat;
      %attr.rsvp;
      %attr.cutype;
      %attr.member;
      %attr.delegated-to;
      %attr.delegated-from;
      %attr.sent-by;
      %attr.dir;
      value NOTATION (CALADR) #IMPLIED>

<!ELEMENT contact (#PCDATA)*>
<!ATTLIST contact
      %attr.language;
      %attr.altrep;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT organizer (#PCDATA)>
<!ATTLIST organizer
      %attr.language;
      %attr.cn;
      %attr.sent-by;
      %attr.dir;
      value NOTATION (CALADR) #IMPLIED>

<!ELEMENT recurrence-id (#PCDATA)>
<!ATTLIST recurrence-id
      %attr.tzid;
      %attr.range;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT related-to (#PCDATA)>
<!ATTLIST related-to
      %attr.reltype;
      value NOTATION (TEXT) #IMPLIED>

<!ELEMENT url EMPTY>
<!ATTLIST url
      uri ENTITY #REQUIRED>

<!ELEMENT uid (#PCDATA)>
<!ATTLIST uid
      value NOTATION (TEXT) #IMPLIED>

<!-- Recurrence component property element type declarations -->

<!ELEMENT exdate (#PCDATA)>
<!ATTLIST exdate
      %attr.tzid;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT exrule (#PCDATA)>
<!ATTLIST exrule
      value NOTATION (RECUR) #IMPLIED>

<!ELEMENT rdate (#PCDATA)>
<!ATTLIST rdate
      %attr.tzid;
      value NOTATION (DATE-TIME | DATE) "DATE-TIME">

<!ELEMENT rrule (#PCDATA)>
<!ATTLIST rrule
      value NOTATION (RECUR) #IMPLIED>

<!-- Alarm component property element type declarations -->

<!ELEMENT action (#PCDATA)>
<!ATTLIST action
      value NOTATION (TEXT) #IMPLIED>
<!-- Text value must be a valid enumeration -->

<!ELEMENT repeat (#PCDATA)>
<!ATTLIST repeat
      value NOTATION (INTEGER) #IMPLIED>

<!ELEMENT trigger (#PCDATA)>
<!ATTLIST trigger
      %attr.related-to;
      value NOTATION (DURATION | DATE-TIME) "DURATION">

<!-- Change management component property element type -->
<!-- declarations -->

<!ELEMENT created (#PCDATA)>
<!ATTLIST created
      value NOTATION (DATE-TIME) #IMPLIED>

<!ELEMENT dtstamp (#PCDATA)>
<!ATTLIST dtstamp
      value NOTATION (DATE-TIME) #IMPLIED>

<!ELEMENT last-modified (#PCDATA)>
<!ATTLIST last-modified
      value NOTATION (DATE-TIME) #IMPLIED>

<!ELEMENT sequence (#PCDATA)>
<!ATTLIST sequence
      value NOTATION (INTEGER) #IMPLIED>

<!-- Miscellaneous component property element type declarations -->



<!ELEMENT request-status (#PCDATA)>
<!ATTLIST request-status
      %attr.language;
      value NOTATION (TEXT) #IMPLIED>

<!-- iCalendar object element type declarations -->

<!ELEMENT iCalendar (vcalendar+)>

<!ELEMENT vcalendar (%cal.comp;)*>
<!ATTLIST vcalendar
      %attr.language;
      xmlns CDATA #FIXED 'http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-00.txt'
      calscale CDATA "GREGORIAN"
      method CDATA "PUBLISH"
      version CDATA #REQUIRED
      prodid CDATA #IMPLIED>
<!-- version - Must be "2.0" if document conforms to this spec. -->
<!-- calscale - Calendar scale. Default is GREGORIAN. -->
<!-- method - C&S method. Default is iTIP PUBLISH. -->
<!-- prodid - ISO 9070 FPI for product that generated iCalendar. -->

<!-- "vevent" element type declaration -->
<!ELEMENT vevent ((%vevent.opt1;)*, (%vevent.optm;)*, valarm*)>

<!-- "vtodo" element type declaration -->
<!ELEMENT vtodo ((%vtodo.opt1;)*, (%vtodo.optm;)*, valarm*)>

<!-- "vjournal" element type declaration -->
<!ELEMENT vjournal ((%vjournal.opt1;)*, (%vjournal.optm;)*)>

<!-- "vfreebusy" element type declaration -->
<!ELEMENT vfreebusy ((%vfreebusy.opt1;)*, (%vfreebusy.optm;)*)>

<!-- "vtimezone" element type declaration -->
<!ELEMENT vtimezone (%vtimezone.man;, (%vtimezone.opt1;)*,
      (%vtimezone.mann;)*)>

<!ELEMENT standard (((%standard.man;)*), (%standard.optm;)*)>

<!ELEMENT daylight (((%daylight.man;)*), (%daylight.optm;)*)>

<!ELEMENT valarm ((%valarm.audio;) | (%valarm.display;) |
      (%valarm.email;) | (%valarm.procedure;))>